<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>网络地址类型</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="datatype-geometric.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="datatype.html">快退</a></td><td width="60%" align="center" valign="bottom">章8. Data Types</td><td width="10%" align="right" valign="top"><a href="datatype.html">快进</a></td><td width="10%" align="right" valign="top"><a href="datatype-bit.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="DATATYPE-NET-TYPES">8.8. 网络地址类型</a></h1><a name="AEN5507"></a>
<p>PostgreSQL提供用于存储 IPv4 、IPv6 、MAC 地址的数据类型，在<a href="datatype-net-types.html#DATATYPE-NET-TYPES-TABLE">表8-17</a>里显示。用这些数据类型存储网络地址比用纯文本类型好，因为这些类型提供输入错误检查和好些种特殊的操作和功能(见<a href="functions-net.html">节9.11</a>)。</p>
<div class="TABLE"><a name="DATATYPE-NET-TYPES-TABLE"></a>
<p><b>表8-17. 网络地址类型</b></p>
<table border="1" class="CALSTABLE"><col><col><col>
<thead>
<tr><th>名字</th><th>存储空间</th><th>描述</th></tr>
</thead>
<tbody>
<tr><td><tt class="TYPE">cidr</tt></td><td>12 或 24 字节</td><td>IPv4 或 IPv6 网络</td></tr>
<tr><td><tt class="TYPE">inet</tt></td><td>12 或 24 字节</td><td>IPv4 或 IPv6 网络和主机</td></tr>
<tr><td><tt class="TYPE">macaddr</tt></td><td>6 字节</td><td>MAC 地址</td></tr>
</tbody>
</table>
</div>
<p>在对 <tt class="TYPE">inet</tt> 或 <tt class="TYPE">cidr</tt> 数据类型进行排序的时候，IPv4 地址总是排在 IPv6 地址前面，包括那些封装或者是映射在 IPv6 地址里的 IPv4 地址，比如 ::10.2.3.4 或 ::ffff::10.4.3.2</p>
<div class="SECT2"><h2 class="SECT2"><a name="DATATYPE-INET">8.8.1. <tt class="TYPE">inet</tt></a></h2><a name="AEN5544"></a>
<p><tt class="TYPE">inet</tt> 在一个数据域里保存主机的 IPv4 或 IPv6 地址，以及一个可选的等效子网。子网的等效是通过计算主机地址中有多少位表示网络地址的方法来表示的("子网掩码")。如果子网掩码是 32 并且地址是 IPv4 ，那么不表示任何子网，只是一台主机。在 IPv6 里，地址长度是 128 位，因此 128 位表明一个唯一的主机地址。请注意如果你想只接受网络地址，你应该使用 <tt class="TYPE">cidr</tt> 类型而不是 <tt class="TYPE">inet</tt> 类型。</p>
<p>该类型的输入格式是 <tt class="REPLACEABLE"><i>address/y</i></tt> ，这里的 <tt class="REPLACEABLE"><i>address</i></tt> 是 IPv4 或者 IPv6 地址，<tt class="REPLACEABLE"><i>y</i></tt> 是子网掩码的二进制位数。如果 <tt class="REPLACEABLE"><i>/y</i></tt> 部分未填，则子网掩码对 IPv4 而言是 32 ，对 IPv6 而言是 128 ，所以该值表示只有一台主机。显示时，如果该值表示只有一台主机，<tt class="REPLACEABLE"><i>/y</i></tt> 将不会显示</p>
</div>
<div class="SECT2"><h2 class="SECT2"><a name="DATATYPE-CIDR">8.8.2. <tt class="TYPE">cidr</tt></a></h2><a name="AEN5560"></a>
<p><tt class="TYPE">cidr</tt> 保存一个 IPv4 或 IPv6 网络地址。其输入和输出遵循无类别的互联网域路由习惯。声明一个网络的格式是 <tt class="REPLACEABLE"><i>address/y</i></tt> ，这里的 <tt class="REPLACEABLE"><i>address</i></tt> 是 IPv4 或者 IPv6 地址，<tt class="REPLACEABLE"><i>y</i></tt> 是子网掩码的二进制位数。如果省略 <tt class="REPLACEABLE"><i>y</i></tt> ，那么掩码部分用旧的有类别的网络编号系统进行计算，但要求输入的数据已经包括了确定掩码所需的所有字节。声明一个指定掩码的网络地址是错误的。</p>
<p><a href="datatype-net-types.html#DATATYPE-NET-CIDR-TABLE">表8-18</a>是些例子。</p>
<div class="TABLE"><a name="DATATYPE-NET-CIDR-TABLE"></a>
<p><b>表8-18. <tt class="TYPE">cidr</tt> 类型输入举例</b></p>
<table border="1" class="CALSTABLE"><col><col><col>
<thead>
<tr><th><tt class="TYPE">cidr</tt> 输入</th><th><tt class="TYPE">cidr</tt> 输出</th><th><tt class="LITERAL"><code class="FUNCTION">abbrev</code>(<tt class="TYPE">cidr</tt>)</tt></th></tr>
</thead>
<tbody>
<tr><td>192.168.100.128/25</td><td>192.168.100.128/25</td><td>192.168.100.128/25</td></tr>
<tr><td>192.168/24</td><td>192.168.0.0/24</td><td>192.168.0/24</td></tr>
<tr><td>192.168/25</td><td>192.168.0.0/25</td><td>192.168.0.0/25</td></tr>
<tr><td>192.168.1</td><td>192.168.1.0/24</td><td>192.168.1/24</td></tr>
<tr><td>192.168</td><td>192.168.0.0/24</td><td>192.168.0/24</td></tr>
<tr><td>128.1</td><td>128.1.0.0/16</td><td>128.1/16</td></tr>
<tr><td>128</td><td>128.0.0.0/16</td><td>128.0/16</td></tr>
<tr><td>128.1.2</td><td>128.1.2.0/24</td><td>128.1.2/24</td></tr>
<tr><td>10.1.2</td><td>10.1.2.0/24</td><td>10.1.2/24</td></tr>
<tr><td>10.1</td><td>10.1.0.0/16</td><td>10.1/16</td></tr>
<tr><td>10</td><td>10.0.0.0/8</td><td>10/8</td></tr>
<tr><td>10.1.2.3/32</td><td>10.1.2.3/32</td><td>10.1.2.3/32</td></tr>
<tr><td>2001:4f8:3:ba::/64</td><td>2001:4f8:3:ba::/64</td><td>2001:4f8:3:ba::/64</td></tr>
<tr><td>2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128</td><td>2001:4f8:3:ba:2e0:81ff:fe22:d1f1/128</td><td>2001:4f8:3:ba:2e0:81ff:fe22:d1f1</td></tr>
<tr><td>::ffff:1.2.3.0/120</td><td>::ffff:1.2.3.0/120</td><td>::ffff:1.2.3/120</td></tr>
<tr><td>::ffff:1.2.3.0/128</td><td>::ffff:1.2.3.0/128</td><td>::ffff:1.2.3.0/128</td></tr>
</tbody>
</table>
</div>
</div>
<div class="SECT2"><h2 class="SECT2"><a name="DATATYPE-INET-VS-CIDR">8.8.3. <tt class="TYPE">inet</tt> 对比 <tt class="TYPE">cidr</tt></a></h2>
<p><tt class="TYPE">inet</tt> 和 <tt class="TYPE">cidr</tt> 类型之间的基本区别是 <tt class="TYPE">inet</tt> 接受子网掩码，而 <tt class="TYPE">cidr</tt> 不接受。</p>
<div class="TIP">
<blockquote class="TIP">
<p><b>【提示】</b>如果你不喜欢 <tt class="TYPE">inet</tt> 或 <tt class="TYPE">cidr</tt> 值的输出格式，请试一下 <code class="FUNCTION">host</code>, <code class="FUNCTION">text</code>, <code class="FUNCTION">abbrev</code> 函数。</p>
</blockquote>
</div>
</div>
<div class="SECT2"><h2 class="SECT2"><a name="DATATYPE-MACADDR">8.8.4. <tt class="TYPE">macaddr</tt></a></h2><a name="AEN5668"></a><a name="AEN5670"></a>
<p><tt class="TYPE">macaddr</tt> 类型存储 MAC 地址，也就是以太网卡硬件地址(尽管 MAC 地址还用于其它用途)。可以接受多种自定义的格式，包括
<table border="0">
<tbody>
<tr><td><tt class="LITERAL">'08002b:010203'</tt></td></tr>
<tr><td><tt class="LITERAL">'08002b-010203'</tt></td></tr>
<tr><td><tt class="LITERAL">'0800.2b01.0203'</tt></td></tr>
<tr><td><tt class="LITERAL">'08-00-2b-01-02-03'</tt></td></tr>
<tr><td><tt class="LITERAL">'08:00:2b:01:02:03'</tt></td></tr>
</tbody>
</table>
它们声明的都是同一个地址。对于数据位 <tt class="LITERAL">a</tt> 到 <tt class="LITERAL">f</tt> ，大小写都行。输出总是我们上面给出的最后一种形式。</p>
</div>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="datatype-geometric.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="datatype-bit.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">几何类型</td><td width="34%" align="center" valign="top"><a href="datatype.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">位串类型</td></tr>
</table>
</div>
</body></html>